package com.codeGenerator;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
//代码生成器，运行此文件可以自动生成controller层，mapper层和service层骨架文件，节省了手动创建骨架文件的麻烦
public class CodeGenerator {
	final static String dirPath = "D:\\workspace-sts-3.9.12.RELEASE";//生成的文件将会放置到此路径

	public static void main(String[] args) {
		Map<String, String> customFileMap = new HashMap();
		customFileMap.put("FinanceEditBo.java", "/vm/java/editBo.java.vm");
		customFileMap.put("FinanceAddBo.java", "/vm/java/addBo.java.vm");
		customFileMap.put("FinanceQueryBo.java", "/vm/java/queryBo.java.vm");
		customFileMap.put("FinanceVo.java", "/vm/java/vo.java.vm");
                                           
		FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/reading", "root", "123456")//数据库配置
				.globalConfig(builder -> {
					builder.author("古嘉琦") // 设置作者
							.enableSwagger() // 开启 swagger 模式
							.fileOverride() // 覆盖已生成文件
							.dateType(DateType.ONLY_DATE)// 日期类型
							.outputDir(dirPath); // 指定输出目录
				})
				.packageConfig(builder -> {
					builder.parent("com") // 设置父包名
							//.moduleName("sys") // 设置父包模块名
							.controller("com.controller")
							.mapper("com.mapper")
							.service("com.server")
							.serviceImpl("com.serverImpl")
							.entity("com.beans")
							//.other("model")其他文件的生成路径
							.pathInfo(Collections.singletonMap(OutputFile.mapperXml, dirPath)); // 设置mapperXml生成路径
				})
				.strategyConfig(builder -> {
					builder.addInclude("question") // 设置需要生成的表名，只能一个表一个表的生成
					//表名user,account,article,question,readingdata,file,admin,role,permission,userrole,rolepermission,grade,articlegrade,exporttable
							//.addTablePrefix("test_") // 设置过滤表前缀
							//entity配置
							.entityBuilder()
							.enableLombok()
							//.superClass(com.cloud.model.common.BaseDataEntity.class)//继承父类
							//.logicDeleteColumnName("del_flag")//逻辑删除字段
							.enableTableFieldAnnotation()
							//controller配置
							.controllerBuilder()
							.formatFileName("%sController")
							.enableRestStyle()
							//service配置
							.serviceBuilder()
							.formatServiceFileName("%sService")
							.formatServiceImplFileName("%sServiceImpl")
							//dao配置
							.mapperBuilder()
							.formatMapperFileName("%sMapper")
							.formatXmlFileName("%sMapper")
							.enableMapperAnnotation();
				})
				//模板配置
				.templateConfig((scanner, builder) -> builder
						/*.disable()//禁用所有模板
						//.entityKt("/templates/entity.java")// 设置实体模板路径(kotlin)，/templates/entity.java
//						.disable(TemplateType.ENTITY)//禁用模板 TemplateType.ENTITY
						.entity("/java/domain.java.tpl") // 设置Template模板路径，.tpl 后缀
			               .service("/java/service.java.tpl") // 设置Template模板路径，.tpl 后缀
			               .serviceImpl("/java/serviceImpl.java.tpl") // 设置Template模板路径，.tpl 后缀
			               .mapper("/java/mapper.java.tpl") // 设置Template模板路径，.tpl 后缀
			               .mapperXml("/java/mapper.xml.tpl") // 设置Template模板路径，.tpl 后缀
			               .controller("/java/controller.java.tpl") // 设置Template模板路径，.tpl 后缀
			                */
						.build() // 加入构建队列
			              
				)
				.injectionConfig(builder -> builder
						.beforeOutputFile((tableInfo, objectMap) -> {
							System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
						}) //输出文件之前消费者
						//.customFile(customFileMap) //自定义配置模板文件
						.build()//加入构建队列
				)
				// 使用Freemarker引擎模板，默认的是Velocity引擎模板
				.templateEngine(new VelocityTemplateEngine())
				.execute();
	}

}